#include <string.h>
#include <iostream>

// （1）练习构造函数的规范写法，预习析构函数，尝试解决课上Computer类的内存泄露问题；
// （2）预习拷贝构造函数、赋值运算符函数，尝试完成这两个函数的定义，以提供Computer对象复制、赋值的支持；
// （3）预习特殊的数据成员和成员函数
using namespace std;

class Computer
{
public:
    // 无参构造函数
    Computer()
    {
        cout<< "Computer()" <<endl;
    }
    // 参数列表构造函数
    Computer(const char* name, double price)
        : _name( new char[strlen(name) + 1] ())
        , _price(price)
        {
            cout<< "Computer(const char* , double )" <<endl;
            strcpy(_name, name);
        }
    // 拷贝构造函数
    Computer(const Computer & pc)
        : _name(new char[strlen(pc._name) + 1] ())
        , _price(pc._price)
        {
            cout<< "Computer(const Computer & )" <<endl;
            strcpy(_name, pc._name);
        }
    // 析构函数
    ~Computer()
    {
        cout<< "~Computer()" <<endl;
        if(_name != nullptr)
        {
            delete [] _name;
            _name = nullptr;
        }
    }
    Computer& operator=(const Computer& pc)
    {
        cout<< "operator=(const Computer& )" <<endl;
        _name = new char[strlen(pc._name) + 1] ();
        strcpy(_name, pc._name);
        _price = pc._price;
        return *this;
    }

    void print(){cout << _name << ", " << _price << endl;}
private:
    char* _name;
    double _price;
};

int main(void)
{
    Computer pc("huawei", 6999);
    pc.print();
    // 调用拷贝构造函数
    Computer pc1 = pc;
    pc1.print();

    Computer pc2;
    // 调用赋值运算符函数
    pc2 = pc;
    pc2.print();
    return 0;
}